package com.upbos.upm.cfg;

import com.upbos.cache.SingleCacheManager;
import com.upbos.core.ret.RetCode;
import com.upbos.core.ret.RetData;
import com.upbos.data.core.Pagination;
import com.upbos.upm.common.Constants;
import com.upbos.upm.common.UpmConfiguration;
import com.upbos.upm.entity.Cfg;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author wangjz
 */
@Service
public class CfgService {

    @Resource
    private CfgDao cfgDao;

    @Resource
    private SingleCacheManager singleCacheManager;

    @Resource
    private UpmConfiguration configuration;
    /**
     * 查询系统参数
     *
     * @param pageNo     当前页
     * @param pageSize   页数
     * @param categoryId 分类Id
     * @param name       参数名称
     * @return 系统参数列表
     */
    public Pagination listCfg(Integer pageNo, Integer pageSize, Long categoryId, String name) {
        return cfgDao.listCfg(pageNo, pageSize, categoryId, name);
    }

    /**
     * 保存系统参数
     *
     * @param cfg 参数对象
     * @return 保存结果
     */
    @Transactional(rollbackFor = Exception.class)
    public RetData saveCfg(Cfg cfg) {
        RetData retData = new RetData(RetCode.SUCCESS);

        // 判断参数标识是否存在
        if (cfgDao.getCfgCount(cfg) > 0) {
            retData.setCode(RetCode.FAIL);
            retData.setMsg("参数标识【" + cfg.getKey() + "】已经存在");
            return retData;
        }

        // 根据是否有参数ID，进行插入或者更新对象
        if (cfg.getId() == null) {
            cfgDao.insertCfg(cfg);
        } else {
            cfgDao.updateCfg(cfg);
        }
        // 删除缓存
        singleCacheManager.getCache(configuration.getCacheName()).removeForHash(Constants.CACHE_CFG_KEY, cfg.getKey());
        return retData;
    }

    /**
     * 根据id删除参数
     *
     * @param cfg
     */
    @Transactional(rollbackFor = Exception.class)
    public void deleteCfg(Cfg cfg) {
        cfgDao.deleteCfg(cfg);
        // 删除缓存
        singleCacheManager.getCache(configuration.getCacheName()).removeForHash(Constants.CACHE_CFG_KEY, cfg.getKey());
    }

    /**
     * 获取参数对象
     *
     * @param key 参数标识
     * @return 参数对象
     */
    public Cfg getCfg(String key) {
        return cfgDao.getCfg(key);
    }

    /**
     * 根据参数标识，查询参数列表
     *
     * @param keys 参数标识数组
     * @return 参数列表
     */
    public List<Cfg> listCfgByKey(String... keys) {
        List cacheCfgs = singleCacheManager.getCache(configuration.getCacheName()).multiGetForHash(Constants.CACHE_CFG_KEY, Arrays.asList(keys));
        List<Cfg> rtnList = new ArrayList<>();

        for (String key : keys) {
            Cfg cacheCfg = getCacheCfg((List<Cfg>) cacheCfgs, key);
            if (cacheCfg == null) {
                cacheCfg = cfgDao.getCfg(key);
                singleCacheManager.getCache(configuration.getCacheName()).putForHash(Constants.CACHE_CFG_KEY, key, cacheCfg);
                rtnList.add(cacheCfg);
            } else {
                rtnList.add(cacheCfg);
            }
        }
        return rtnList;
    }

    private Cfg getCacheCfg(List<Cfg> cacheCfgs, String key) {
        for (Cfg cfg : cacheCfgs) {
            if (cfg != null && key.equals(cfg.getKey())) {
                return cfg;
            }
        }
        return null;
    }
}
